למה כל עמוד המאה באתר עולה רק אחרי חמש שניות
ואיך פונקציה אחת של session_start לוקחת כל כך הרבה זמן.
Garbage Collection
בתור ברירת מחדל נתוני הסשן נשמרים בתור קבצים פיזיים בתיקיה מיוחדת של השרת.
תוקפו של סשן מסוים הינו 25 דקות. לאחר מכן, קובץ הסשן שמחזיק את הנתונים - נמחק.
מי מחק את הסשן?
במחשבים אין קסמים וסשנים לא נמחקים אוטומטית. מישהו מוחק אותם. יש פונקציה כזאת איפשהו ומישהו מריץ אותה.
הפונקציה הזאת נכנסת לתיקיה שבה נשמרים כל הסשנים, עוברת קובץ קובץ, בודקת את תאריך הגישה(קריאה) האחרון לאותו קובץ ואב עברו 25 דקות מאז - מוחקת אותו.
עכשיו אתה יכול לנחש לבד למה אחד מתוך מאה גלישות לוקח 5 שניות לעלות.
נכון, בגלל שאחת למאה בקשות PHP מפעיל את אותה הפונקציה של מחיקת סשנים, שעוברת קובץ קובץ....
אפשר לשנות?
בטח שאפשר. במקום ש-PHP תעשה את זה אחת לכל מאה בקשות, שתעשה אחת ל 10000.
שני הגדרות של php.ini יוצרות משוואה:
session.gc_probability
מונה במשוואה של אחת לכמה בקשות להפעיל את ניקוי הסשנים.
ערך ברירת מחדל 1.
session.gc_divisor
המכנה באותה משוואה.
ברירת מחדל 100 או 1000 (תלוי במערכת הפעלה)
הסיכוי שבבקשה הזו יופעל ניקוי סשנים = 1 / 100
ובוסופו של דבר אחת לכמה בקשות השרת נתקע כדי לנקות את תיקיית הסשנים.
בונוס: מפרקים את PHP
אחד היתרונות של PHP היא שהיא ידידותית למתחילים. ולא צריך לחשוב, לשחק עם ההגדרות או לדעת משהו.
באופן כללי, יתרון מהסוג הזה בא על חשבון ביצועים.
בפועל אפשר ללכת צעד אחד הלאה ולהוריד מ-PHP את הדאגה הזאת.
אפשר להקל על PHP בניקוי סשנים, עבודה עם קבצים ופעולות מיותרות בכל בקשה ולהוציא את מטלת ניקוי הסשנים לפעולה חיצונית.
כדי לכבות את ניקוי הסשנים ב PHP מספיק להציב session.gc_probability = 0
ובמקום זה להוסיף פעולת קרון חדשה שתעשה בדיוק אותו דבר. תמחק את כל קבצי הסשן הישנים
*/15 * * * * find /tmp/sess_* -mmin +25 -exec rm -rf {} \;
פעולה זו תופעל כל רבע שעה ותמחק מהתיקיה הזמנית של השרת את קבצי הסשנים שלא נגעו בהם 25 דקות.
עמודים עם זמן טעינה מעל רבע שניה בגלל session_start פשוט נעלמים.
----------------------------------------------
מה אם זה קורה תמיד לאותו משתמש?
אני מזכיר שמשתמש אחד ששולח כמה בקשות יכול לנעול את קובץ הסשן לעצמו כמו שמתואר
במדריך נעילת סשנים.
תגובות לכתבה:
"כדי לכבות את ניקוי הסשנים ב PHP מספיק להציב session.gc_probability = 1"
אתה לא מתכוון ללהציב 0?
ומדריך מצוין, תודה רבה. :)
מתמטיקה..
תודה :)
תודה רבה :)
עוד טיפ לייעול האתר ... :)
מזכיר על נעילת סשנים:
http://phpguide.co.il/session lock.htm